package com.example.myserver.util.qrcode;


import com.example.myserver.common.exception.InternalServerException;
import com.example.myserver.util.FileUtil;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

/**
 * @author by Jiang Xiaomin
 * @desrc:
 */
public final class QRCodeGeneratorUtil {

    public static final Path CACHE_HOME = Paths.get(System.getProperty("user.dir"), "static", "qrcode");

    static {
        try {
            if (Files.notExists(CACHE_HOME)) {
                Files.createDirectories(CACHE_HOME);
            }
        } catch (IOException e) {
            throw new InternalServerException("初始化默认目录失败");
        }
    }


    private static final int WIDTH = 300;

    private static final int HEIGHT = 300;

    private QRCodeGeneratorUtil() {

    }

    public static Path generateByString(final String content, final String fileName) {
        try {
            final Map<EncodeHintType, Object> hintMap = new HashMap<>();
            hintMap.put(EncodeHintType.CHARACTER_SET, "UTF-8");
            hintMap.put(EncodeHintType.MARGIN, 1);
            hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);

            // 设置背景色和前景色
            final Color backgroundColor = Color.WHITE;
            final Color foregroundColor = Color.BLACK;

            final BitMatrix matrix = new MultiFormatWriter()
                    .encode(content, BarcodeFormat.QR_CODE, WIDTH, HEIGHT, hintMap);

            final BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);

            for (int x = 0; x < WIDTH; x++) {
                for (int y = 0; y < HEIGHT; y++) {
                    final int color = matrix.get(x, y) ? foregroundColor.getRGB() : backgroundColor.getRGB();
                    image.setRGB(x, y, color);
                }
            }
            final Path path = FileUtil.createFile(CACHE_HOME, fileName + ".png");
            ImageIO.write(image, "png", path.toFile());
            return path;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /*public static void generateQRCodeImage(String text, OutputStream outputStream) throws IOException, WriterException {
        int width = 300;
        int height = 300;
        String filePath = "path/to/file"; // 如果需要保存文件到磁盘时使用，否则可以忽略或注释掉此行
        String fileType = "png"; // 文件类型，例如 png, jpg 等
        String charset = "UTF-8"; // 字符集
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
        hints.put(EncodeHintType.CHARACTER_SET, charset);
        hints.put(EncodeHintType.MARGIN, 0); // 设置白边大小，默认为4个像素点，可根据需要调整大小，但不能小于1，否则会抛出异常。
        BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);
        try {
            BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
            Graphics2D graphics = image.createGraphics();
            graphics.setColor(Color.BLACK); // 设置文本颜色为黑色
            graphics.setFont(new Font("Arial", Font.BOLD, 20)); // 设置字体样式和大小
            FontMetrics metrics = graphics.getFontMetrics();
            int x = (width - metrics.stringWidth(text)) / 2; // 计算文本居中位置
            int y = height + metrics.getHeight() / 2; // 计算文本底部位置，这里假定文本高度为metrics.getHeight()，可以根据实际情况调整位置。
            graphics.drawString(text, x, y); // 在二维码下方绘制文本
            graphics.dispose(); // 释放资源
            if (outputStream != null) {
                ImageIO.write(image, fileType, outputStream); // 将图片输出到输出流中，例如 HttpServletResponse 的输出流。
            } else { // 如果不需要输出流，可以保存到文件或直接显示等操作。例如：ImageIO.write(image, fileType, new File(filePath));
                ImageIO.write(image, fileType, new File(filePath)); // 将图片保存到文件系统。
            }
        } catch (Exception e) {
            e.printStackTrace(); // 异常处理，可根据实际情况调整。
        } finally {
            if (outputStream != null) {
                outputStream.close(); // 关闭输出流。
            }
        }
    }

    public static void main(String[] args) {
        try {
            generateQRCodeImage("https://www.baidu.com", null);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (WriterException e) {
            throw new RuntimeException(e);
        }
    }*/
}
